package pl.puntin.punclient.tcplisteners;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.BlockingQueue;

import pl.puntin.punclient.messages.Message;

/**
 * Klasa odpowiedzalna za odberanie wiadmosci
 * przychodzacych od serwera.
 * 
 * @author kakus
 *
 */
public final class IncomingTcpMessageListener
{
	protected static final int BUFFOR_SIZE = 1024;

	private final BlockingQueue<Message> messageQueue;
	
	private Socket socket;

	private InputStream inputStream;

	private Thread listeningThread = null;

	/**
	 * @param messageQueue kolejka do ktorej zostana wsadzone odebrane wiadomosci
	 */
	public IncomingTcpMessageListener(final BlockingQueue<Message> messageQueue)
	{
		this.messageQueue = messageQueue;
	}
	
	/**
	 * Funkcja tworzy gniazdo na ktorym bedziemy nasluchwiac.
	 * 
	 * @param host Nazwa hosta z ktorym chcemy sie polaczyc
	 * @param port Numer portu na ktorym chcemy nasluchiwac.
	 * @throws UnknownHostException
	 * @throws IOException
	 */
	public void init(final String host, final int port) throws UnknownHostException, IOException
	{
		socket = new Socket(host, port);
		inputStream = socket.getInputStream();
	}
	
	/**
	 * Rozpoczyna nasluchwianie.
	 * Tworzony jest nowy watek, ktory w nieskonczone petli obiera
	 * dane przychodzace i pakuje je do kolejki blokujacej.
	 * 
	 * Jesli istnieje jakis watek ktory juz nasluchuje zostaje on
	 * przerwany i na jego miejsce powstanie nowy.
	 */
	public void startListening()
	{
		//TODO dokonczyc nasluchwanie
		
		if(listeningThread != null)
		{
			if(listeningThread.isAlive())
				listeningThread.interrupt();
		}
		
		listeningThread = new Thread(new Runnable()
		{
			@Override
			public void run()
			{
				while ( true )
				{
					byte[] buffor = new byte[BUFFOR_SIZE];
					try
					{
						inputStream.read(buffor);
					} catch (IOException e)
					{
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});
		listeningThread.start();
	}
	
	
}
